/**
 * 一个映射，定义了如何将旧方块ID替换为新方块。
 * 键是旧的 `voxelId`，值是包含新 `id` 和可选 `rot` 的对象。
 * 例如：new Map([[235, { id: 39 }]]) 表示将方块ID为235的方块替换为ID为39的方块。
 */
export type ReplacementMap = Map<voxelId, { id: voxelId; rot?: voxelRotation }>;

/**
 * 定义了用于导出和导入的、高度压缩的蓝图数据结构。
 * 这是蓝图序列化为 JSON 格式时的标准。
 */
export interface CompressedTerrainData {
  /**
   * 蓝图的边界框，定义了其在三维空间中的范围。
   * 使用 `GameBounds3` 类型，包含 `lo` 和 `hi` 两个 `GameVector3` 点。
   */
  bounds:
    | GameBounds3
    | {
        lo: { x: number; y: number; z: number };
        hi: { x: number; y: number; z: number };
      };
  /**
   * 调色板 (palette) 数组。存储了蓝图中使用的所有方块类型。
   * 这是一个平铺的数组，格式为 `[id1, rot1, id2, rot2, ...]`。
   */
  palette: number[];
  /**
   * 图层 (layers) 数组，每个元素是一个代表Y轴一个切片的字符串。
   * 字符串内的每个块由 `x,z,p` 格式表示，其中 `p` 是该方块在调色板中的索引。
   * 块之间由分号分隔。例如: `"0,0,0;1,1,1;2,2,2"`
   */
  layers: string[];
}

/**
 * 在 `TerrainSchematic` 内部用于表示单个方块的高效数据结构。
 */
export type SchematicBlock = {
  /** 方块相对于蓝图原点 (0,0,0) 的X坐标。 */
  x: number;
  /** 方块相对于蓝图原点 (0,0,0) 的Y坐标。 */
  y: number;
  /** 方块相对于蓝图原点 (0,0,0) 的Z坐标。 */
  z: number;
  /** 该方块在调色板 (`palette`) 中的索引 (palette index)。 */
  p: number;
};
